home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 72 / IOPROG_72.ISO / soft / Codice / CRobots / Codice Robot anni precedenti / CR2-SRC.ZIP / SPIDER.R < prev    next >
Encoding:
Text File  |  1992-09-04  |  4.7 KB  |  208 lines

  1.  
  2. /*                     Robot spider.r per CRobots
  3.  
  4.                               Tattica di gioco
  5.  
  6.    Questo  robot si  posiziona negli  angoli  e li' vi  resta fino a che non
  7.    subisce  danni  superiori  al  6%,  dopo  di  che cambia  angolo  secondo
  8.    uno schema fisso che gli permette di girare tutto lo schermo.
  9.    E' una tattica difensiva, in quanto il robot cerca di fuggire dalle zone
  10.    calde dello schermo, piuttosto che cercare gli avversari.
  11.    Inoltre se durante i trasferimenti viene colpito  inverte momentaneamente
  12.    la rotta, per poi tornare alla rotta originaria.
  13.    L' algoritmo di mira e' lo stesso del robot cube.r:  tutto e' affidato ad
  14.    un   sottoprogramma   invocato  iterativamente.   Questo  cerca  i  robot
  15.    avversari  e,  una  volta  trovati, effettua correzioni al tiro secondo i
  16.    loro spostamenti.
  17.    Le correzioni riguardano sia l' angolo che la gittata, e dalla loro messa
  18.    a punto dipende in modo critico l' efficienza del robot.
  19.  
  20.    Scritto da:
  21.    Mario Gregori     Via Calcamuggi 26    Alessandria    (Italy)
  22.    Tel:  0131/345024                                                    */
  23.  
  24.  
  25. /* variabili globali */
  26.  
  27. int    sc_dir;       /* direzione dello scanner */
  28. int    sfas;         /* sfasamento dell' angolo di fuoco */
  29. int    oldd;         /* distanza a cui si trovava l' avversario */
  30. int    dist;         /* distanza a cui si trova l' avversario */
  31. int    scd2;         /* direzione di un secondo scanner */
  32. /* (cerca avversari piu' vicini)   */
  33. int    danni;        /* totale danni subiti */
  34.  
  35. main()
  36. {
  37.     sc_dir = 0;
  38.     scd2 = 0;
  39.     sfas = 0;
  40.     danni = 0;
  41.     oldd = 500;
  42.  
  43.     /* Si posiziona nell' angolo in basso a destra */
  44.     while (loc_y() > 80) {
  45.         drive (270, 80);
  46.         look();
  47.         if ((damage() - danni) > 6) 
  48.             dietrofront(270);
  49.     }
  50.     drive (0, 0);
  51.     look();
  52.     while (loc_x() < 920) {
  53.         drive (0, 80);
  54.         look();
  55.         if ((damage() - danni) > 6) 
  56.             dietrofront(0);
  57.     }
  58.     drive (0, 0);
  59.  
  60.     while (1) {
  61.         /* resta nell' angolo finche' non viene colpito */
  62.         stay();
  63.  
  64.         /* si trasferisce nell' angolo in alto a destra */
  65.         while (loc_y() < 470) {
  66.             drive (112, 80);
  67.             look();
  68.             if ((damage() - danni) > 6) 
  69.                 dietrofront(112);
  70.         }
  71.         drive (112, 50);
  72.         look();
  73.         while (loc_y() < 920 && loc_x() < 920) {
  74.             drive (68, 80);
  75.             look();
  76.             if ((damage() - danni) > 6) 
  77.                 dietrofront(68);
  78.         }
  79.         drive (68, 0);
  80.         /* ci resta per un po'... */
  81.         stay();
  82.  
  83.         /* si trasferisce nell' angolo in alto a sinistra */
  84.         while (loc_x() > 530) {
  85.             drive (202, 80);
  86.             if ((damage() - danni) > 6) 
  87.                 dietrofront(202);
  88.             look();
  89.         }
  90.         drive (202, 50);
  91.         look();
  92.         while (loc_y() < 920 && loc_x() > 80) {
  93.             drive (158, 80);
  94.             if ((damage() - danni) > 6) 
  95.                 dietrofront(158);
  96.             look();
  97.         }
  98.         drive (68, 0);
  99.         stay();
  100.  
  101.         /* si trasferisce nell' angolo in basso a sinistra */
  102.         while (loc_y() > 530) {
  103.             drive (292, 80);
  104.             if ((damage() - danni) > 6) 
  105.                 dietrofront(292);
  106.             look();
  107.         }
  108.         drive (292, 50);
  109.         look();
  110.         while (loc_y() > 80 && loc_x() > 80) {
  111.             drive (248, 80);
  112.             if ((damage() - danni) > 6) 
  113.                 dietrofront(248);
  114.             look();
  115.         }
  116.         drive (248, 0);
  117.         stay();
  118.  
  119.         /* torna nell' angolo in basso a destra */
  120.         while (loc_x() < 470) {
  121.             drive (22, 80);
  122.             if ((damage() - danni) > 6) 
  123.                 dietrofront(22);
  124.             look();
  125.         }
  126.         drive (22, 50);
  127.         look();
  128.         while (loc_y() > 80 && loc_x() < 920) {
  129.             drive (338, 80);
  130.             if ((damage() - danni) > 6) 
  131.                 dietrofront(338);
  132.             look();
  133.         }
  134.         drive (338, 0);
  135.     }
  136. }
  137.  
  138.  
  139. /* Si guarda intorno e spara */
  140.  
  141. look ()
  142. {
  143.     int    i, dist2;
  144.  
  145.     if (!(dist = scan (sc_dir, 5))) {
  146.         if (dist = scan(sc_dir -= 10, 5))
  147.             sfas = -6;
  148.         else if (dist = scan(sc_dir -= 15, 10))
  149.             sfas = -10;
  150.         else if (dist = scan(sc_dir += 35, 5))
  151.             sfas = 6;
  152.         else if (dist = scan(sc_dir += 15, 10))
  153.             sfas = 10;
  154.         else {
  155.             i = 10;
  156.             while (!(dist = scan(sc_dir += 20, 10)) && (--i))
  157.                 ;
  158.             sfas = 0;
  159.             oldd = dist;
  160.             return;
  161.         }
  162.     }
  163.     if ((dist - oldd) > 0)
  164.         if (cannon(sc_dir + sfas, (dist * 15) / 13)) 
  165.             sfas = 0;
  166.         else if (cannon(sc_dir + sfas, (dist * 15) / 17)) 
  167.             sfas = 0;
  168.     dist2 = scan (scd2 -= 20, 10);
  169.     if ((dist2 > 0) && (dist2 < (dist - 50)) ) {
  170.         sc_dir = scd2;
  171.         oldd = dist2;
  172.     } else 
  173.         oldd = dist;
  174. }
  175.  
  176.  
  177. /* resta fermo finche' non subisce danni per piu' del 6% */
  178.  
  179. stay()
  180. {
  181.     danni = damage();
  182.     while ((damage() - danni) <= 6)
  183.         look();
  184.     danni = damage();
  185. }
  186.  
  187.  
  188. /* inverte momentaneamente la rotta */
  189.  
  190. dietrofront (dir)
  191. int    dir;       /* attuale direzione di marcia */
  192. int    dir2;      /* direzione opposta */
  193. int    i;
  194. {
  195.     drive (dir, 0);
  196.     look();
  197.     dir2 = dir + 180;
  198.     i = 5;
  199.     while (--i) {
  200.         drive (dir2, 80);
  201.         look();
  202.     }
  203.     drive (dir2, 0);
  204.     danni = damage();
  205. }
  206.  
  207.  
  208.